// https://www.acwing.com/problem/content/838/

#include <iostream>
#include <vector>

using namespace std;

const int MAX_ARRAY_SIZE = 1e5+5;

// 存储每个节点的父节点
int parents[MAX_ARRAY_SIZE];
// 按秩合并（rank 代表树的高度）
int ranks[MAX_ARRAY_SIZE];

void init(int n) {
    fill(ranks, ranks + n, 1);
    // 初始时，每个元素的父节点是自己
    for (int i=1; i<=n; i++) {
        parents[i] = i;
    }
}


int find(int x) {
    if (parents[x] != x) {
        return find(parents[x]);
    }
    return x;
}

void unite(int node1, int node2) {
    int root1 = find(node1);
    int root2 = find(node2);
    if (root1 != root2) {
        if (ranks[root1] > ranks[root2]) {
            parents[root2] = root1;
        } else if (ranks[root1] < ranks[root2]) {
            parents[root1] = root2;
        } else {
            parents[root2] = root1;
            ranks[root1]++;  // 如果高度相同，合并后根节点高度 +1
        }
    }

}

// 判断两个元素是否属于同一集合
bool connected(int x, int y) {
    return find(x) == find(y);
}

int main() {
    int m, n;
    char ch;
    int node1, node2;
    cin>>m>>n;
    init(n);
    while (n-->0) {
        cin>>ch>>node1>>node2;
        if (ch == 'M') {
            unite(node1, node2);
        } else if (ch == 'Q') {
            auto result = connected(node1, node2);
            result ? cout<<"Yes"<<endl: cout<<"No"<<endl;
        }
    }
    return 0;
}
